Micron Document
<!DOCTYPE html>
<html class="client-nojs vector-feature-night-mode-disabled vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-sticky-header-enabled" lang="en" dir="ltr"><head>
<meta charset="UTF-8">
<title>Cohen–Sutherland algorithm</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="canonical" href="https://en.wikipedia.org/wiki/Cohen%E2%80%93Sutherland_algorithm"> <link href="./mw/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/ext.pygments.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/user.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link rel="stylesheet" type="text/css" href="./mw/site.styles.css">
<link rel="stylesheet" type="text/css" href="./mw/noscript.css">
<link rel="stylesheet" type="text/css" href="./footer.css">
<link rel="stylesheet" type="text/css" href="./vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Cohen–Sutherland_algorithm rootpage-Cohen–Sutherland_algorithm skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading">
<span id="openzim-page-title" class="mw-page-title-main"><span class="mw-page-title-main">Cohen–Sutherland algorithm</span></span>
</h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="en" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="en" dir="ltr">

<p>In <a href="Computer_graphics" title="Computer graphics">computer graphics</a>, the <b>Cohen–Sutherland algorithm</b> is an <a href="Algorithm" title="Algorithm">algorithm</a> used for <a href="Line_clipping" title="Line clipping">line clipping</a>. The algorithm divides a two-dimensional space into 9 regions and then efficiently determines the lines and portions of lines that are visible in the central region of interest (the <a href="Viewport" title="Viewport">viewport</a>).
</p><p>The algorithm was developed in 1967 during <a href="Flight_simulator" title="Flight simulator">flight simulator</a> work by <a href="Danny_Cohen_(engineer)" class="mw-redirect" title="Danny Cohen (engineer)">Danny Cohen</a> and <a href="Ivan_Sutherland" title="Ivan Sutherland">Ivan Sutherland</a>.<sup id="cite_ref-Sproull_1-0" class="reference"><a href="#cite_note-Sproull-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup>
</p>
<meta property="mw:PageProp/toc">
<div class="mw-heading mw-heading2"><h2 id="The_algorithm">The algorithm</h2></div>
<p>The algorithm includes, excludes or partially includes the line based on whether:
</p>
<ul><li>Both endpoints are in the viewport region (bitwise OR of endpoints = 0000): <a href="Trivial_accept" class="mw-redirect" title="Trivial accept">trivial accept</a>.</li>
<li>Both endpoints share at least one non-visible region, which implies that the line does not cross the visible region. (bitwise AND of endpoints ≠ 0000): <a href="Trivial_reject" class="mw-redirect" title="Trivial reject">trivial reject</a>.</li>
<li>Both endpoints are in different regions: in case of this nontrivial situation the algorithm finds one of the two points that is outside the viewport region (there will be at least one point outside). The intersection of the outpoint and extended viewport border is then calculated (i.e. with the parametric equation for the line), and this new point replaces the outpoint. The algorithm repeats until a trivial accept or reject occurs.</li></ul>
<p>The numbers in the figure below are called <a href="Outcodes_(computer_graphics)" class="mw-redirect" title="Outcodes (computer graphics)">outcodes</a>. An outcode is computed for each of the two points in the line. The outcode will have 4 bits for two-dimensional clipping, or 6 bits in the three-dimensional case. The first bit is set to 1 if the point is above the viewport. The bits in the 2D outcode represent: top, bottom, right, left. For example, the outcode 1010 represents a point that is top-right of the viewport.
</p>
<dl><dd><table class="wikitable">
<tbody><tr>
<th></th>
<th>left</th>
<th>central</th>
<th>right
</th></tr>
<tr>
<th>top
</th>
<td>1001
</td>
<td>1000
</td>
<td>1010
</td></tr>
<tr>
<th>central
</th>
<td>0001
</td>
<td>0000
</td>
<td>0010
</td></tr>
<tr>
<th>bottom
</th>
<td>0101
</td>
<td>0100
</td>
<td>0110
</td></tr></tbody></table></dd></dl>
<p>Note that the outcodes for endpoints <i>must</i> be recalculated on each iteration after the clipping occurs.
</p><p>The Cohen–Sutherland algorithm can be used only on a rectangular <a href="Clip_window" class="mw-redirect" title="Clip window">clip window</a>.
</p>
<div class="mw-heading mw-heading2"><h2 id="Example_C/C++_implementation">Example C/C++ implementation</h2></div>
<div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span class="k">typedef</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">OutCode</span><span class="p">;</span>

<span class="k">const</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">INSIDE</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mb">0b0000</span><span class="p">;</span>
<span class="k">const</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">LEFT</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mb">0b0001</span><span class="p">;</span>
<span class="k">const</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">RIGHT</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mb">0b0010</span><span class="p">;</span>
<span class="k">const</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">BOTTOM</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mb">0b0100</span><span class="p">;</span>
<span class="k">const</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">TOP</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mb">0b1000</span><span class="p">;</span>

<span class="c1">// Compute the bit code for a point (x, y) using the clip rectangle</span>
<span class="c1">// bounded diagonally by (xmin, ymin), and (xmax, ymax)</span>

<span class="c1">// ASSUME THAT xmax, xmin, ymax and ymin are global constants.</span>

<span class="n">OutCode</span><span class="w"> </span><span class="nf">ComputeOutCode</span><span class="p">(</span><span class="kt">double</span><span class="w"> </span><span class="n">x</span><span class="p">,</span><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">y</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="n">OutCode</span><span class="w"> </span><span class="n">code</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">INSIDE</span><span class="p">;</span><span class="w"> </span><span class="c1">// initialised as being inside of clip window</span>

<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">xmin</span><span class="p">)</span><span class="w"> </span><span class="c1">// to the left of clip window</span>
<span class="w"> </span><span class="n">code</span><span class="w"> </span><span class="o">|=</span><span class="w"> </span><span class="n">LEFT</span><span class="p">;</span>
<span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="n">xmax</span><span class="p">)</span><span class="w"> </span><span class="c1">// to the right of clip window</span>
<span class="w"> </span><span class="n">code</span><span class="w"> </span><span class="o">|=</span><span class="w"> </span><span class="n">RIGHT</span><span class="p">;</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">y</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">ymin</span><span class="p">)</span><span class="w"> </span><span class="c1">// below the clip window</span>
<span class="w"> </span><span class="n">code</span><span class="w"> </span><span class="o">|=</span><span class="w"> </span><span class="n">BOTTOM</span><span class="p">;</span>
<span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">y</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="n">ymax</span><span class="p">)</span><span class="w"> </span><span class="c1">// above the clip window</span>
<span class="w"> </span><span class="n">code</span><span class="w"> </span><span class="o">|=</span><span class="w"> </span><span class="n">TOP</span><span class="p">;</span>

<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">code</span><span class="p">;</span>
<span class="p">}</span>

<span class="c1">// Cohen–Sutherland clipping algorithm clips a line from</span>
<span class="c1">// P0 = (x0, y0) to P1 = (x1, y1) against a rectangle with </span>
<span class="c1">// diagonal from (xmin, ymin) to (xmax, ymax).</span>
<span class="kt">bool</span><span class="w"> </span><span class="nf">CohenSutherlandLineClip</span><span class="p">(</span><span class="kt">double</span><span class="o">&amp;</span><span class="w"> </span><span class="n">x0</span><span class="p">,</span><span class="w"> </span><span class="kt">double</span><span class="o">&amp;</span><span class="w"> </span><span class="n">y0</span><span class="p">,</span><span class="w"> </span><span class="kt">double</span><span class="o">&amp;</span><span class="w"> </span><span class="n">x1</span><span class="p">,</span><span class="w"> </span><span class="kt">double</span><span class="o">&amp;</span><span class="w"> </span><span class="n">y1</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="c1">// compute outcodes for P0, P1, and whatever point lies outside the clip rectangle</span>
<span class="w"> </span><span class="n">OutCode</span><span class="w"> </span><span class="n">outcode0</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ComputeOutCode</span><span class="p">(</span><span class="n">x0</span><span class="p">,</span><span class="w"> </span><span class="n">y0</span><span class="p">);</span>
<span class="w"> </span><span class="n">OutCode</span><span class="w"> </span><span class="n">outcode1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ComputeOutCode</span><span class="p">(</span><span class="n">x1</span><span class="p">,</span><span class="w"> </span><span class="n">y1</span><span class="p">);</span>
<span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="n">accept</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">false</span><span class="p">;</span>

<span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="nb">true</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="p">(</span><span class="n">outcode0</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">outcode1</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">// bitwise OR is 0: both points inside window; trivially accept and exit loop</span>
<span class="w"> </span><span class="n">accept</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">true</span><span class="p">;</span>
<span class="w"> </span><span class="k">break</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">outcode0</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="n">outcode1</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">// bitwise AND is not 0: both points share an outside zone (LEFT, RIGHT, TOP,</span>
<span class="w"> </span><span class="c1">// or BOTTOM), so both must be outside window; exit loop (accept is false)</span>
<span class="w"> </span><span class="k">break</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">// failed both tests, so calculate the line segment to clip</span>
<span class="w"> </span><span class="c1">// from an outside point to an intersection with clip edge</span>
<span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">x</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="p">;</span>

<span class="w"> </span><span class="c1">// At least one endpoint is outside the clip rectangle; pick it.</span>
<span class="w"> </span><span class="n">OutCode</span><span class="w"> </span><span class="n">outcodeOut</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">outcode1</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="n">outcode0</span><span class="w"> </span><span class="o">?</span><span class="w"> </span><span class="n">outcode1</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">outcode0</span><span class="p">;</span>

<span class="w"> </span><span class="c1">// Now find the intersection point;</span>
<span class="w"> </span><span class="c1">// use formulas:</span>
<span class="w"> </span><span class="c1">// slope = (y1 - y0) / (x1 - x0)</span>
<span class="w"> </span><span class="c1">// x = x0 + (1 / slope) * (ym - y0), where ym is ymin or ymax</span>
<span class="w"> </span><span class="c1">// y = y0 + slope * (xm - x0), where xm is xmin or xmax</span>
<span class="w"> </span><span class="c1">// No need to worry about divide-by-zero because, in each case, the</span>
<span class="w"> </span><span class="c1">// outcode bit being tested guarantees the denominator is non-zero</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">outcodeOut</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="n">TOP</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="c1">// point is above the clip window</span>
<span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">x0</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="p">(</span><span class="n">x1</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">x0</span><span class="p">)</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="p">(</span><span class="n">ymax</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">y0</span><span class="p">)</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="p">(</span><span class="n">y1</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">y0</span><span class="p">);</span>
<span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ymax</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">outcodeOut</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="n">BOTTOM</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="c1">// point is below the clip window</span>
<span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">x0</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="p">(</span><span class="n">x1</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">x0</span><span class="p">)</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="p">(</span><span class="n">ymin</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">y0</span><span class="p">)</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="p">(</span><span class="n">y1</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">y0</span><span class="p">);</span>
<span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ymin</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">outcodeOut</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="n">RIGHT</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="c1">// point is to the right of clip window</span>
<span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">y0</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="p">(</span><span class="n">y1</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">y0</span><span class="p">)</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="p">(</span><span class="n">xmax</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">x0</span><span class="p">)</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="p">(</span><span class="n">x1</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">x0</span><span class="p">);</span>
<span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">xmax</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">outcodeOut</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="n">LEFT</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="c1">// point is to the left of clip window</span>
<span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">y0</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="p">(</span><span class="n">y1</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">y0</span><span class="p">)</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="p">(</span><span class="n">xmin</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">x0</span><span class="p">)</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="p">(</span><span class="n">x1</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">x0</span><span class="p">);</span>
<span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">xmin</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>

<span class="w"> </span><span class="c1">// Now we move outside point to intersection point to clip</span>
<span class="w"> </span><span class="c1">// and get ready for next pass.</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">outcodeOut</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">outcode0</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">x0</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">x</span><span class="p">;</span>
<span class="w"> </span><span class="n">y0</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">y</span><span class="p">;</span>
<span class="w"> </span><span class="n">outcode0</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ComputeOutCode</span><span class="p">(</span><span class="n">x0</span><span class="p">,</span><span class="w"> </span><span class="n">y0</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">x1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">x</span><span class="p">;</span>
<span class="w"> </span><span class="n">y1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">y</span><span class="p">;</span>
<span class="w"> </span><span class="n">outcode1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ComputeOutCode</span><span class="p">(</span><span class="n">x1</span><span class="p">,</span><span class="w"> </span><span class="n">y1</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">accept</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
<div class="mw-heading mw-heading2"><h2 id="Notes">Notes</h2></div>
<style data-mw-deduplicate="TemplateStyles:r1239543626">
/* start https://en.wikipedia.org/ */


.mw-parser-output .reflist{margin-bottom:0.5em;list-style-type:decimal}@media screen{.mw-parser-output .reflist{font-size:90%}}.mw-parser-output .reflist .references{font-size:100%;margin-bottom:0;list-style-type:inherit}.mw-parser-output .reflist-columns-2{column-width:30em}.mw-parser-output .reflist-columns-3{column-width:25em}.mw-parser-output .reflist-columns{margin-top:0.3em}.mw-parser-output .reflist-columns ol{margin-top:0}.mw-parser-output .reflist-columns li{page-break-inside:avoid;break-inside:avoid-column}.mw-parser-output .reflist-upper-alpha{list-style-type:upper-alpha}.mw-parser-output .reflist-upper-roman{list-style-type:upper-roman}.mw-parser-output .reflist-lower-alpha{list-style-type:lower-alpha}.mw-parser-output .reflist-lower-greek{list-style-type:lower-greek}.mw-parser-output .reflist-lower-roman{list-style-type:lower-roman}


/* end https://en.wikipedia.org/ */
</style><div class="reflist">
<div class="mw-references-wrap"><ol class="references">
<li id="cite_note-Sproull-1"><span class="mw-cite-backlink"><b><a href="#cite_ref-Sproull_1-0">^</a></b></span> <span class="reference-text"><i>Principles of Interactive Computer Graphics</i>, p. 124, 252, by <a href="Bob_Sproull" title="Bob Sproull">Bob Sproull</a> and William M. Newman, 1973, McGraw–Hill Education, International edition, <style data-mw-deduplicate="TemplateStyles:r1238218222">
/* start https://en.wikipedia.org/ */


.mw-parser-output cite.citation{font-style:inherit;word-wrap:break-word}.mw-parser-output .citation q{quotes:"\"""\"""'""'"}.mw-parser-output .citation:target{background-color:rgba(0,127,255,0.133)}.mw-parser-output .id-lock-free.id-lock-free a{background:url("./mw/Lock-green.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-limited.id-lock-limited a,.mw-parser-output .id-lock-registration.id-lock-registration a{background:url("./mw/Lock-gray-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-subscription.id-lock-subscription a{background:url("./mw/Lock-red-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .cs1-ws-icon a{background:url("./mw/Wikisource-logo.svg")right 0.1em center/12px no-repeat}body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-free a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-limited a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-registration a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-subscription a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .cs1-ws-icon a{background-size:contain;padding:0 1em 0 0}.mw-parser-output .cs1-code{color:inherit;background:inherit;border:none;padding:inherit}.mw-parser-output .cs1-hidden-error{display:none;color:var(--color-error,#d33)}.mw-parser-output .cs1-visible-error{color:var(--color-error,#d33)}.mw-parser-output .cs1-maint{display:none;color:#085;margin-left:0.3em}.mw-parser-output .cs1-kern-left{padding-left:0.2em}.mw-parser-output .cs1-kern-right{padding-right:0.2em}.mw-parser-output .citation .mw-selflink{font-weight:inherit}@media screen{.mw-parser-output .cs1-format{font-size:95%}html.skin-theme-clientpref-night .mw-parser-output .cs1-maint{color:#18911f}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .cs1-maint{color:#18911f}}


/* end https://en.wikipedia.org/ */
</style><a href="ISBN_(identifier)" class="mw-redirect" title="ISBN (identifier)">ISBN</a>&nbsp;<bdi>0-07-085535-8</bdi>.</span>
</li>
</ol></div></div>
<div class="mw-heading mw-heading2"><h2 id="See_also">See also</h2></div>
<p>Algorithms used for the same purpose:
</p>
<ul><li><a href="Liang%E2%80%93Barsky_algorithm" title="Liang–Barsky algorithm">Liang–Barsky algorithm</a></li>
<li><a href="Cyrus%E2%80%93Beck_algorithm" title="Cyrus–Beck algorithm">Cyrus–Beck algorithm</a></li>
<li><a href="Nicholl%E2%80%93Lee%E2%80%93Nicholl_algorithm" title="Nicholl–Lee–Nicholl algorithm">Nicholl–Lee–Nicholl algorithm</a></li>
<li><a href="Fast_clipping" class="mw-redirect" title="Fast clipping">Fast clipping</a></li></ul>
<div class="mw-heading mw-heading2"><h2 id="References">References</h2></div>
<ul><li>James D. Foley. <i><a rel="nofollow" class="external text" href="https://books.google.com/books?id=-4ngT05gmAQC">Computer graphics: principles and practice</a></i>. Addison-Wesley Professional, 1996. p.&nbsp;113.</li></ul>
<div class="mw-heading mw-heading2"><h2 id="External_links">External links</h2></div>
<ul><li><a rel="nofollow" class="external text" href="https://github.com/mapbox/lineclip">JavaScript polyline clipping library using Cohen-Sutherland algorithm</a></li>
<li><a rel="nofollow" class="external text" href="https://web.archive.org/web/20161221235815/http://gpolo.awardspace.info/clip/main.html">Animated JavaScript implementation</a></li>
<li><a rel="nofollow" class="external text" href="https://github.com/omarreis/CohenSutherland">Delphi implementation</a></li>
<li><a rel="nofollow" class="external text" href="https://github.com/asjadnaqvi/stata-clipgeo">Stata implementation</a></li></ul></div><!--htdig_noindex--><div><div class="zim-footer">
This article is issued from <a class="external text" title="Last edited on 2025-06-18" href="https://en.wikipedia.org/wiki/?title=Cohen%E2%80%93Sutherland_algorithm&amp;oldid=1296145545">Wikipedia</a>. The text is available under <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">Creative Commons Attribution-Share Alike 4.0</a> unless otherwise noted. Additional terms may apply for the media files.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>

</body></html>